JavaScript Proksi treplarini ilg'or obyekt moslashtirish uchun o'rganing. Asosiy obyekt operatsiyalarini ushlab olish va o'zgartirishni o'rganib, kuchli metaprogrammalash usullarini qo'llang.
JavaScript Proksi Treplari: Obyekt Xulq-atvorini Ilg'or Moslashtirish
JavaScript Proksi obyekti obyektlardagi fundamental operatsiyalarni ushlab qolish va moslashtirish imkonini beruvchi kuchli vositadir. U aslida boshqa obyekt (target) atrofida o'ram (wrapper) vazifasini bajaradi va xususiyatlarga kirish, tayinlash, funksiyalarni chaqirish kabi operatsiyalarni ushlab qolish va qayta belgilash uchun "hook"lar taqdim etadi. Bu "hook"lar "treplar" deb ataladi. Bu qobiliyat metaprogrammalash, validatsiya, log yuritish va boshqa turli ilg'or texnikalar uchun keng imkoniyatlar dunyosini ochadi.
JavaScript Proksilarini Tushunish
Proksi treplarining o'ziga xos jihatlariga sho'ng'ishdan oldin, Proksi obyektining asoslarini qisqacha ko'rib chiqaylik. Proksi Proxy() konstruktori yordamida yaratiladi:
const target = {};
const handler = {};
const proxy = new Proxy(target, handler);
Bu yerda, target biz proksi qilmoqchi bo'lgan obyekt, handler esa trep metodlarini o'z ichiga olgan obyekt. Agar handler bo'sh bo'lsa (yuqoridagi misoldagidek), proksi xuddi target obyekti kabi ishlaydi. Sehrgarlik biz handler obyekti ichida treplarni belgilaganimizda sodir bo'ladi.
Proksi Treplarining Kuchi
Proksi treplari ma'lum obyekt operatsiyalarini ushlab qoluvchi va moslashtiruvchi funksiyalardir. Ular sizga target obyektining o'zini to'g'ridan-to'g'ri o'zgartirmasdan uning xulq-atvorini o'zgartirish imkonini beradi. Vazifalarni bu tarzda ajratish proksilardan foydalanishning asosiy afzalligidir.
Quyida mavjud proksi treplarining to'liq ro'yxati keltirilgan:
get(target, property, receiver): Xususiyatga kirishni ushlab qoladi (masalan,obj.propertyyokiobj['property']).set(target, property, value, receiver): Xususiyatga qiymat tayinlashni ushlab qoladi (masalan,obj.property = value).apply(target, thisArg, argumentsList): Funksiya chaqiruvlarini ushlab qoladi (faqat proksi qilinayotgan funksiyalarga tegishli).construct(target, argumentsList, newTarget):newoperatorini ushlab qoladi (faqat proksi qilinayotgan konstruktorlarga tegishli).defineProperty(target, property, descriptor):Object.defineProperty()ni ushlab qoladi.deleteProperty(target, property):deleteoperatorini ushlab qoladi (masalan,delete obj.property).getOwnPropertyDescriptor(target, property):Object.getOwnPropertyDescriptor()ni ushlab qoladi.has(target, property):inoperatorini ushlab qoladi (masalan,'property' in obj).preventExtensions(target):Object.preventExtensions()ni ushlab qoladi.setPrototypeOf(target, prototype):Object.setPrototypeOf()ni ushlab qoladi.getPrototypeOf(target):Object.getPrototypeOf()ni ushlab qoladi.ownKeys(target):Object.keys(),Object.getOwnPropertyNames()vaObject.getOwnPropertySymbols()ni ushlab qoladi.
Proksi Treplarining Amaliy Misollari
Keling, bu treplardan qanday foydalanish mumkinligini ko'rsatish uchun ba'zi amaliy misollarni ko'rib chiqaylik.
1. set Trepi yordamida Xususiyatlarni Validatsiya qilish
Tasavvur qiling, sizda foydalanuvchi ma'lumotlarini ifodalovchi obyekt bor va siz ma'lum xususiyatlar ma'lum qoidalarga rioya qilishini ta'minlashni xohlaysiz. set trepi buning uchun juda mos keladi.
const user = {};
const validator = {
set: function(target, property, value) {
if (property === 'age') {
if (typeof value !== 'number' || value < 0) {
throw new TypeError('Yosh manfiy bo\'lmagan son bo\'lishi kerak.');
}
}
// Qiymatni saqlash uchun standart xatti-harakat
target[property] = value;
return true; // Muvaffaqiyatni bildirish
}
};
const proxy = new Proxy(user, validator);
proxy.age = 30; // Yaxshi ishlaydi
console.log(proxy.age); // Natija: 30
try {
proxy.age = -5; // Xatolik yuzaga keladi
} catch (error) {
console.error(error.message);
}
try {
proxy.age = "invalid";
} catch (error) {
console.error(error.message);
}
Ushbu misolda set trepi age xususiyatini tayinlashdan oldin uni tekshiradi. Agar qiymat son bo'lmasa yoki manfiy bo'lsa, xatolik yuzaga keladi. Bu obyektda noto'g'ri ma'lumotlar saqlanishining oldini oladi.
2. get Trepi yordamida Xususiyatga Kirishni Loglash
get trepi har safar biror xususiyatga murojaat qilinganda buni loglash uchun ishlatilishi mumkin. Bu disk raskadrovka yoki audit maqsadlarida foydali bo'lishi mumkin.
const product = { name: 'Laptop', price: 1200 };
const logger = {
get: function(target, property) {
console.log(`Murojaat qilinayotgan xususiyat: ${property}`);
return target[property];
}
};
const proxy = new Proxy(product, logger);
console.log(proxy.name); // Logda: Murojaat qilinayotgan xususiyat: name, Natija: Laptop
console.log(proxy.price); // Logda: Murojaat qilinayotgan xususiyat: price, Natija: 1200
3. set Trepi yordamida Faqat O'qish Uchun Mo'ljallangan Xususiyatlarni Amalga Oshirish
Siz set trepidan foydalanib, ma'lum xususiyatlarni o'zgartirishni oldini olishingiz va ularni faqat o'qish uchun samarali qilishinigiz mumkin.
const config = { apiKey: 'YOUR_API_KEY' };
const readOnlyHandler = {
set: function(target, property, value) {
if (property === 'apiKey') {
throw new Error('apiKey xususiyatini o\'zgartirish mumkin emas. U faqat o\'qish uchun mo\'ljallangan.');
}
target[property] = value;
return true;
}
};
const proxy = new Proxy(config, readOnlyHandler);
console.log(proxy.apiKey); // Natija: YOUR_API_KEY
try {
proxy.apiKey = 'NEW_API_KEY'; // Xatolik yuzaga keladi
} catch (error) {
console.error(error.message);
}
4. apply Trepi yordamida Funksiya Chaqiruvini Ushlab Qolish
apply trepi funksiya chaqiruvlarini ushlab qolish imkonini beradi. Bu funksiyalarga loglash, vaqtni o'lchash yoki validatsiya qo'shish uchun foydalidir.
const add = function(x, y) {
return x + y;
};
const traceHandler = {
apply: function(target, thisArg, argumentsList) {
console.log(`Funksiya quyidagi argumentlar bilan chaqirilmoqda: ${argumentsList}`);
const result = target.apply(thisArg, argumentsList);
console.log(`Funksiya qaytardi: ${result}`);
return result;
}
};
const proxy = new Proxy(add, traceHandler);
const sum = proxy(5, 3); // Argumentlar va natijani loglaydi
console.log(sum); // Natija: 8
5. construct Trepi yordamida Konstruktorni Ushlab Qolish
construct trepi target konstruktor funksiya bo'lganda new operatoriga qilingan chaqiruvlarni ushlab qolish imkonini beradi. Bu konstruksiya jarayonini o'zgartirish yoki argumentlarni tekshirish uchun foydalidir.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const constructHandler = {
construct: function(target, argumentsList, newTarget) {
console.log(`Yangi Person nusxasi quyidagi argumentlar bilan yaratilmoqda: ${argumentsList}`);
if (argumentsList[1] < 0) {
throw new Error("Yosh manfiy bo'lishi mumkin emas");
}
return new target(...argumentsList);
}
};
const proxy = new Proxy(Person, constructHandler);
const john = new proxy('John', 30);
console.log(john);
try {
const baby = new proxy('Invalid', -1);
} catch (error) {
console.error(error.message);
}
6. deleteProperty yordamida Xususiyatni O'chirishdan Himoya Qilish
Ba'zida siz obyektdan ma'lum xususiyatlarni o'chirishning oldini olishni xohlashingiz mumkin. deleteProperty trepi buni uddalay oladi.
const secureData = { id: 123, username: 'admin' };
const preventDeletion = {
deleteProperty: function(target, property) {
if (property === 'id') {
throw new Error('id xususiyatini o\'chirish mumkin emas.');
}
delete target[property];
return true;
}
};
const proxy = new Proxy(secureData, preventDeletion);
delete proxy.username; // Yaxshi ishlaydi
console.log(secureData);
try {
delete proxy.id; // Xatolik yuzaga keladi
} catch (error) {
console.error(error.message);
}
7. ownKeys yordamida Xususiyatlarni Sanab Chiqishni Moslashtirish
ownKeys trepi Object.keys() yoki Object.getOwnPropertyNames() kabi metodlardan foydalanganda qaysi xususiyatlar qaytarilishini nazorat qilish imkonini beradi. Bu xususiyatlarni yashirish yoki obyekt tuzilishining moslashtirilgan ko'rinishini taqdim etish uchun foydalidir.
const hiddenData = { _secret: 'password', publicData: 'visible' };
const hideSecrets = {
ownKeys: function(target) {
return Object.keys(target).filter(key => !key.startsWith('_'));
}
};
const proxy = new Proxy(hiddenData, hideSecrets);
console.log(Object.keys(proxy)); // Natija: ['publicData']
Global Kontekstdagi Qo'llash Holatlari
Proksilar obyekt xulq-atvorini joylashuv, foydalanuvchi rollari yoki boshqa kontekstual omillarga qarab moslashtirish qobiliyati tufayli global ilovalarda ayniqsa qimmatli bo'lishi mumkin. Quyida ba'zi misollar keltirilgan:
- Lokalizatsiya: Foydalanuvchi tanlagan tilga qarab lokalizatsiya qilingan matnlarni dinamik ravishda olish uchun
gettrepidan foydalanish. Masalan, "greeting" nomli xususiyat fransuz foydalanuvchilar uchun "Bonjour", ispan foydalanuvchilar uchun "Hola" va ingliz foydalanuvchilar uchun "Hello" qiymatini qaytarishi mumkin. - Ma'lumotlarni Niqoblash: Foydalanuvchi rollari yoki mintaqaviy qoidalarga asoslangan nozik ma'lumotlarni niqoblash.
gettrepi kerakli ruxsatlarga ega bo'lmagan yoki qat'iy ma'lumotlar maxfiyligi qonunlariga ega bo'lgan mintaqalarda joylashgan foydalanuvchilar uchun o'rinbosar qiymat yoki o'zgartirilgan ma'lumot versiyasini qaytarish uchun ishlatilishi mumkin. Masalan, kredit karta raqamining faqat oxirgi to'rtta raqamini ko'rsatish. - Valyuta Konvertatsiyasi: Foydalanuvchi joylashuviga qarab valyuta qiymatlarini avtomatik ravishda konvertatsiya qilish. Narx xususiyatiga murojaat qilinganda,
gettrepi foydalanuvchining valyutasini olib, qiymatni mos ravishda konvertatsiya qilishi mumkin. - Vaqt Mintaqasini Boshqarish: Sana va vaqtni foydalanuvchining mahalliy vaqt mintaqasida taqdim etish.
gettrepi sana/vaqt xususiyatiga kirishni ushlab qolish va qiymatni foydalanuvchining vaqt mintaqasi sozlamalariga muvofiq formatlash uchun ishlatilishi mumkin. - Kirishni Nazorat Qilish: Foydalanuvchi rollariga asoslangan nozik donador kirish nazoratini amalga oshirish.
getvasettreplari ruxsatsiz foydalanuvchilarning ma'lum xususiyatlarga kirishini yoki o'zgartirishini oldini olish uchun ishlatilishi mumkin. Masalan, administrator barcha foydalanuvchi xususiyatlarini o'zgartirishi mumkin, oddiy foydalanuvchi esa faqat o'z profil ma'lumotlarini o'zgartirishi mumkin.
E'tiborga Olinadigan Jihatlar va Eng Yaxshi Amaliyotlar
Proksilar kuchli bo'lsa-da, ulardan oqilona foydalanish va quyidagilarni hisobga olish muhim:
- Ishlash Samaradorligi: Proksi treplari qo'shimcha yuklamani keltirib chiqaradi, chunki har bir operatsiya ushlab qolinishi va qayta ishlanishi kerak. Afzalliklari ishlash xarajatlaridan ustun bo'lmasa, kodingizning ishlash samaradorligi muhim bo'lgan qismlarida proksilardan foydalanishdan saqlaning. Proksi ishlatilishi sababli yuzaga keladigan har qanday ishlashdagi to'siqlarni aniqlash uchun kodingizni profillang.
- Murakkablik: Proksilardan haddan tashqari foydalanish kodingizni tushunish va disk raskadrovka qilishni qiyinlashtirishi mumkin. Proksi treplaringizni sodda va aniq vazifalarga qaratilgan holda saqlang. Proksi mantig'ingizning maqsadi va xulq-atvorini tushuntirish uchun uni aniq hujjatlashtiring.
- Moslik: Sizning maqsadli muhitingiz proksilarni qo'llab-quvvatlashiga ishonch hosil qiling. Proksilar zamonaviy brauzerlar va Node.js da keng qo'llab-quvvatlansa-da, eski muhitlarda to'liq qo'llab-quvvatlanmasligi mumkin. Agar kerak bo'lsa, polifillardan foydalanishni ko'rib chiqing.
- Qo'llab-quvvatlanuvchanlik: Proksiga asoslangan kodingizning uzoq muddatli qo'llab-quvvatlanuvchanligi haqida diqqat bilan o'ylab ko'ring. Ilovangiz rivojlanib borgan sari proksi mantig'ingiz yaxshi tuzilgan va o'zgartirish uchun oson ekanligiga ishonch hosil qiling.
Xulosa
JavaScript Proksi treplari obyekt xulq-atvorini moslashtirish uchun murakkab mexanizmni taqdim etadi. Ushbu treplarni tushunib va ulardan foydalanib, siz kuchli metaprogrammalash texnikalarini amalga oshirishingiz, ma'lumotlar validatsiyasini kuchaytirishingiz, xavfsizlikni yaxshilashingiz va ilovalaringizni turli global kontekstlarga moslashtirishingiz mumkin. Ishlash samaradorligi va murakkablikdan qochish uchun proksilardan ehtiyotkorlik bilan foydalanish kerak bo'lsa-da, ular mustahkam va moslashuvchan JavaScript ilovalarini yaratish uchun qimmatli vositani taklif qiladi. Turli treplar bilan tajriba o'tkazing va ular ochib beradigan ijodiy imkoniyatlarni o'rganing!